home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Examples / AppKit / ScrollDoodScroll / CustomCell.m < prev    next >
Encoding:
Text File  |  1992-06-16  |  2.5 KB  |  86 lines

  1. // CustomCell.m
  2. // By Jayson Adams, NeXT Developer Support Team
  3. // You may freely copy, distribute and reuse the code in this example.
  4. // NeXT disclaims any warranty of any kind, expressed or implied, as to its
  5. // fitness for any particular use.
  6.  
  7. // This subclass of cell draws a dot image to the right of the text
  8. // and provides fancy, printable highlighting.
  9.  
  10. #import <appkit/appkit.h>
  11. #import "CustomCell.h"
  12.  
  13. @implementation CustomCell
  14.  
  15.   
  16. #define IMAGEMARGIN 4.0
  17.   
  18. - drawInside:(const NXRect *)cellFrame inView:controlView
  19. {
  20.     /* every CustomCell needs these two */
  21.     static id dotImage = nil;
  22.     static id sharedTextCell = nil;
  23.  
  24.     NXRect rect = *cellFrame;
  25.     NXPoint imageOrigin;
  26.     NXSize dotSize;
  27.         
  28.     if (!dotImage) {
  29.     dotImage = [NXImage findImageNamed:"Dot"];
  30.     }
  31.     [dotImage getSize:&dotSize];
  32.  
  33.   /* erase the cell */
  34.     PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY);
  35.     NXRectFill(cellFrame);
  36.  
  37.   /* draw the "attachment" image */
  38.     imageOrigin.x = NX_X(cellFrame) + IMAGEMARGIN;
  39.     imageOrigin.y = NX_Y(cellFrame) + NX_HEIGHT(cellFrame) -
  40.                 (NX_HEIGHT(cellFrame) - dotSize.height) / 2.0;
  41.  
  42.     [dotImage composite:NX_SOVER toPoint:&imageOrigin];
  43.       
  44.     NX_WIDTH(&rect) -= (dotSize.width + IMAGEMARGIN * 2.0 - NX_X(&rect));
  45.     NX_X(&rect) += dotSize.width + IMAGEMARGIN * 2.0;
  46.  
  47.     if (!sharedTextCell) {
  48.         sharedTextCell = [[Cell alloc] init];
  49.     [sharedTextCell setWrap:NO];
  50.     }
  51.     [sharedTextCell setFont:[self font]];
  52.     [sharedTextCell setStringValue:[self stringValue]];
  53.     [sharedTextCell drawInside:&rect inView:controlView];
  54.     
  55.   /* all drawing from now on will be in dark gray */
  56.     PSsetgray(NX_DKGRAY);
  57.     
  58.   /* draw the two dark gray lines above and below the cell */
  59.     if (cFlags1.state || cFlags1.highlighted) {
  60.         NXRect rectArray[2];
  61.       /*
  62.        * draw 1-pixel tall rectangles instead of lines (this is faster than
  63.        * PSmoveto(); PSlineto()).
  64.        */
  65.     NXSetRect(&(rectArray[0]), NX_X(cellFrame), NX_Y(cellFrame),
  66.         NX_WIDTH(cellFrame), 1.0);
  67.     NXSetRect(&(rectArray[1]), NX_X(cellFrame), NX_MAXY(cellFrame) - 1.0,
  68.         NX_WIDTH(cellFrame), 1.0);
  69.  
  70.       /* using NXRectFillList is faster than separate calls to NXRectFill */
  71.     NXRectFillList(rectArray, 2);
  72.     }
  73.  
  74.     return self;
  75. }
  76.  
  77. - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag
  78. {
  79.     if (cFlags1.highlighted != flag) {
  80.     cFlags1.highlighted = flag;
  81.     [self drawInside:cellFrame inView:controlView];
  82.     }
  83.     return self;
  84. }
  85.  
  86. @end